﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using BLL.Validation;
using Entities;
using Entities.IRepository;

namespace BLL
{
    public class QLNhanVien : IValidator<NhanVien>
    {
        private readonly IGeneralRepository<NhanVien> _repository;

        public QLNhanVien(IGeneralRepository<NhanVien> itr)
        {
            _repository = itr;
        }
        /// <summary>
        /// Kiểm tra lỗi khi nhập dữ liệu trên form
        /// </summary>
        /// <param name="nv">nhân viên</param>
        /// <returns></returns>
        public ValidationResult Validate(NhanVien nv)
        {
            var vResult = new ValidationResult();
            if (string.IsNullOrEmpty(nv.HoTen.Trim()))
                vResult.Messages.Add("Họ tên nhân viên phải khác rỗng");
            if (DateTime.Now.Year-nv.NgaySinh.Year<16)
                vResult.Messages.Add("Ngày sinh không phù hợp. Nhân viên phải đủ 18 tuổi tính đến năm hiện tại.");
            if (nv.NgaySinh > DateTime.Now)
                vResult.Messages.Add("Ngày sinh không phù hợp.");
            foreach (NhanVien n in _repository.GetAll())
                if (nv.Username == n.Username && nv.MaNhanVien != n.MaNhanVien)
                    vResult.Messages.Add("Tài khoản đã được sử dụng");
           
            if (string.IsNullOrEmpty(nv.ChucVu.Trim()))
                vResult.Messages.Add("Chức vụ nhân viên phải khác rỗng");
            if (string.IsNullOrEmpty(nv.Username.Trim()))
                vResult.Messages.Add("Tên đăng nhập phải khác rỗng");
            if (string.IsNullOrEmpty(nv.TrangThai.Trim()))
                vResult.Messages.Add("Trạng thái phải khác rỗng");
            if (nv.LuongCoBan <= 0 && nv.LuongCoBan % 1000 != 0)
                vResult.Messages.Add("Lương cơ bản phải lớn hơn 0 và là bội số của 1000"); 
            return vResult;
        }
        /// <summary>
        ///  thêm nhân viên
        /// </summary>
        /// <param name="nv">nhân viên</param>
        /// <returns></returns>
        public ActionResult Insert(NhanVien nv)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.Insert(nv))
                    aResult.Exceptions.Add(new Exception("Thêm mới nhân viên không thành công"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }
        /// <summary>
        ///  sửa thông tin nhân viên
        /// </summary>
        /// <param name="nv">nhân viên</param>
        /// <returns></returns>
        public ActionResult Update(NhanVien nv)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.Update(nv))
                    aResult.Exceptions.Add(new Exception("Cập nhật nhân viên không thành công"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }
        /// <summary>
        /// xóa thông tin nhân viên
        /// </summary>
        /// <param name="nv">nhân viên</param>
        /// <returns></returns>
        public ActionResult Delete(NhanVien nv)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.Delete(nv))
                    aResult.Exceptions.Add(new Exception("Xóa nhân viên không thành công"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }
    }
}
